#  https://bing.xinac.net/ 必应壁纸 - 每日一图

import time
import random
import re
from pathlib import Path
from DrissionPage import SessionPage

def get_bing_img():
    # 创建页面对象
    page = SessionPage()

    # 循环爬取
    for i in range(1, 200):  # 爬取1-200页
        try:
            # 访问网页
            page.get(f'https://bing.xinac.net/?page={i}')

            # xpath获取图片节点列表
            links = page.eles('xpath://div[@class="image"]//img')

            # xpath获取图片名称节点列表
            name_list = page.eles('xpath://div[contains(@class, "item-card")]//div[contains(@class, "title")]//h2')

            # 遍历图片节点
            for index, link in enumerate(links):
                try:
                    # 获取图片链接
                    img_url = link.attr("src")

                    # 修改图片固定尺寸为1920x1080 px
                    img_url = img_url.replace('400x240', '1920x1080')
                    img_url = img_url.replace("/w/400/h/240", "/w/1920/h/1080")

                    # 获取图片名称
                    name = name_list[index].text + ".jpg"
                    name = name.replace("\"", "“") # 替换非法字符,其它非法字符框架内部自动处理

                    # 判断图片是否已存在
                    file_path = Path(r'./必应壁纸 - 每日一图/' + name)
                    if file_path.exists():
                        print("图片 " + name + " 已存在,跳过")
                        continue

                    # 执行下载
                    page.download(img_url, r'.\必应壁纸 - 每日一图', rename=name)
                except Exception as e:
                    print("图片下载异常:" + e)
        except Exception as e:
            print("执行异常:" + e)

        print("=========================第" + str(i) + "页爬取完成==================================")

        # 随机停止0.5-2s
        time.sleep((random.randint(0, 150) + 50) / 100)


# 检查文件名是否合法
def is_valid_windows_filename(filename):
    # 检查文件名长度
    if len(filename) > 260:  # 通常情况下，Windows 文件名限制为 260 个字符
        return False

        # 禁用字符
    invalid_chars = re.compile(r'[<>:"/\\|?*]')
    if invalid_chars.search(filename):
        return False

        # 检查文件名是否以空格或点开头
    if filename.startswith((' ', '.')):
        return False

        # 检查是否为系统保留名称
    reserved_names = {'CON', 'PRN', 'AUX', 'NUL',
                      'COM1', 'COM2', 'COM3', 'COM4', 'COM5', 'COM6', 'COM7', 'COM8', 'COM9',
                      'LPT1', 'LPT2', 'LPT3', 'LPT4', 'LPT5', 'LPT6', 'LPT7', 'LPT8', 'LPT9'}
    # 忽略大小写（Windows文件系统通常不区分大小写）
    filename_upper = filename.upper()
    if filename_upper in reserved_names or filename_upper.endswith(
            ('.BAT', '.CMD', '.EXE', '.TMP', '.BAK', '.LNK', '.SYS')):
        return False

        # 可以通过其他检查，例如检查路径是否有效（如果需要）

    return True


if __name__ == '__main__':
    get_bing_img()

